package Aula17;

import java.util.LinkedList;

public class TabelaHash {
	private LinkedList<Integer>[] tabela;
	private int k;
	private int tamanho;
	
	public TabelaHash(int tamanho) {
		tabela = new LinkedList[tamanho];
		for(int i = 0; i < tabela.length; i++){
			tabela[i] = new LinkedList<Integer>();
		}
		this.tamanho = tamanho;
		k = achandoK();
	}

	private int achandoK(){
		int k = tamanho;
		
		while(!ehPrimo(k)){
			k -= 1;
		}
		return k;
	}
	
	private boolean ehPrimo(int k) {
		boolean ehPrimo = true;
		int resto;
		int denominador = k-1;
		while(true){
			if (denominador == 1)
				break;
			resto = k % denominador;
			if(resto == 0){
				ehPrimo = false;
				break;
			}
			denominador -= 1;	
		}
		return ehPrimo;
	}
	
	private int funcaoHash(int i){
		if(k == 0){   //Nesse algoritmo isso nunca ira ocorrer.
			k = achandoK();
		}
		return Math.abs(i % k);
	}

	public void add(int numero) {
		tabela[funcaoHash(numero)].add(numero);
	}
	
	public boolean contains(int i) {
		return tabela[funcaoHash(i)].contains(i);
	}
}
